package container.queue;

import java.util.Vector;
import java.util.concurrent.TimeUnit;

/**
 * 有N张火车票，每张票都有一个编号
 * 同时有10个窗口对外售票
 * 写一个模拟程序
 *
 * @author: 李德才
 * @description:
 * @create: 2020-12-13 18:47
 **/
public class VectorTicket {
    /**
     * java.util.vector提供了向量类(Vector)以实现类似动态数组的功能。
     * 创建了一个向量类的对象后，可以往其中随意插入不同类的对象，即不需顾及类型也不需预先选定向量的容量，并可以方便地进行查找
     */
    static final Vector<String> tickets = new Vector<>();

    static {
        /**
         * 添加是线程安全的
         * public final synchronized void adddElement(Object obj);
         * public synchronized boolean add(E e);
         */
        for (int i = 0; i < 1000; i++) tickets.add("票 编号：" + i);
    }

    public static void main(String[] args) {

        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                /**
                 * Vector 本身是原子性的，
                 * *********** 但是这里程序在获取数量（tickets.size()）和删除操作（tickets.remove(0)）之间不是原子性的 *************
                 * 如果这里不加  synchronized 则会有很多程序都认为  tickets.size() > 0
                 * 导致超卖 这里的解决方法是将调用程序加锁
                 */
                synchronized (tickets) {
                    while (tickets.size() > 0) {
                        try {
                            TimeUnit.MILLISECONDS.sleep(10);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        /**
                         * public synchronized E remove(int index);
                         * public synchronized E firstElement();
                         * public synchronized E lastElement();
                         */
                        System.out.println("销售了--" + tickets.remove(0));
                    }
                }

            }).start();
        }
    }

}
